逐浪CLI Studio技术站

vuePress-theme-reco 逐浪CMS发哥    2020 - 2021
逐浪CLI Studio技术站 逐浪CLI Studio技术站

Choose mode

  • dark
  • auto
  • light
首页
导览
  • vue
  • 证书
  • bootstrap
  • css
  • 开发
  • 微软技术
  • windows
  • C#
  • cms
  • 安全
  • 数据库
  • 网络
Bootstrap-Vue
视频
时间线
Bootstrap中国站
下载逐浪CMS
Contact
  • NPM
  • GitHub
  • 73ic工具站
  • 在线Markdown
  • Vs code技巧
  • zico图标
  • 逐浪字库
  • UNI国际字码表
  • 关于逐浪
  • 企业歌曲
author-avatar

逐浪CMS发哥

34

文章

94

标签

首页
导览
  • vue
  • 证书
  • bootstrap
  • css
  • 开发
  • 微软技术
  • windows
  • C#
  • cms
  • 安全
  • 数据库
  • 网络
Bootstrap-Vue
视频
时间线
Bootstrap中国站
下载逐浪CMS
Contact
  • NPM
  • GitHub
  • 73ic工具站
  • 在线Markdown
  • Vs code技巧
  • zico图标
  • 逐浪字库
  • UNI国际字码表
  • 关于逐浪
  • 企业歌曲
  • build

    • C#与dotNET项目想要另存为一个新项目sln文件丢了怎么办
    • CefSharp-基于cSharp的客户端开发框架技术栈开发全记录
    • SVN设置忽略文件列表以及丢失了预定增加的文件解决方法
    • TortoiseSVN管理与命令操作大全
    • Windows应用开发中程序窗口中的各种图标尺寸
    • dotNET5的MVC页面传值方式总结
    • dotNET开发之MVC中Controller返回值类型ActionResult方法总结
    • 后台大哥请进一步:使用Visual Studio编译scss和souce map实现前后端的完美结合
    • Visual Studio中使用Macros插件给代码添加注释、时间和以及自动脚本
    • 在vs2017和vs2019下发布应用之Windows程序打包-附图标修改和默认安装路径定义全教程
    • 基于WPF的酷炫GUI窗口的实现全过程
    • 基于dotNET 5 MVC经典模式引入Swagger进行web api开发和管理发布OAS3标准接口文档全过程
    • 增强的逐浪CMS安全以及解决ASP.NET从客户端中检测到有潜在危险的 Request.Form值错误全过程演示
      • 错误呈现
      • 出现此问题的机理
      • 方法一:最直接简单的方法就是取消微软对其特殊字符的验证了,不过坏处很明显!安全性不高!
      • 方法二:在出现问题的页面中,设置头部Page的属性ValidateRequest=false,代码如下:
      • 方法三:在配置文件中 设置system.web 节点下pages节点的validateRequest="false",代码如下:
      • asp.net mvc项目中的处理方法
      • 软MSDN上关于此异常的相关资料
    • 如何修改visual-studio的sln文件和project工程名

增强的逐浪CMS安全以及解决ASP.NET从客户端中检测到有潜在危险的 Request.Form值错误全过程演示

vuePress-theme-reco 逐浪CMS发哥    2020 - 2021

增强的逐浪CMS安全以及解决ASP.NET从客户端中检测到有潜在危险的 Request.Form值错误全过程演示


逐浪CMS发哥 2020-05-17 C# .net 安全 工程 project

ASP.NET项目的时候就有遇到过“用户代码未处理HttpRequestValidationException:从客户端中检测到有潜在危险的 Request.Form/Request.QueryString值。”的问题,其实这是ASP.NET对于XSS攻击的一种防御手段,防止恶意的HTML标记或脚本数据注入到网站中

  • 错误呈现
  • 出现此问题的机理
  • 方法一:最直接简单的方法就是取消微软对其特殊字符的验证了,不过坏处很明显!安全性不高!
  • 方法二:在出现问题的页面中,设置头部Page的属性ValidateRequest=false,代码如下:
  • 方法三:在配置文件中 设置system.web 节点下pages节点的validateRequest="false",代码如下:
  • asp.net mvc项目中的处理方法
  • 软MSDN上关于此异常的相关资料

# 错误呈现

报一个这样的错误:

这是一个典型的asp.net 4.0问题。

以前做ASP.NET项目的时候就有遇到过“用户代码未处理HttpRequestValidationException:从客户端中检测到有潜在危险的 Request.Form/Request.QueryString值。”的问题,其实这是ASP.NET对于XSS攻击的一种防御手段,防止恶意的HTML标记或脚本数据注入到网站中。

解决发送请求导致提示潜在危险Request.Form/Request.QueryString值的方法 要解决这个问题需要对应多种情况,并且有多种方法来解决。在ASP.NET WebForm项目中可以对单独页面或者全局页面进行处理。

# 出现此问题的机理

对于asp.net构建站占,如何有效处理xss注入,是一个重要的课题,也是用于提升安全的重要节点。 最直接简单的方法就是取消微软对其特殊字符的验证了,不过坏处很明显!安全性不高!

只需在Web.Config配置文件中加入

<httpRuntime requestPathInvalidCharacters="" />
1

即可! 这样处理显然是过于粗糙,等于全站关闭了过滤。 所以我们要寻求进一步的解决方案,于是Zoomla!逐浪MCS团队技术人员开展细节的处理。

# 方法一:最直接简单的方法就是取消微软对其特殊字符的验证了,不过坏处很明显!安全性不高!

只需在Web.Config配置文件中加入即可!

跟出现从客户端(&)中检测到有潜在危险的 Request.Form问题时在Page节点中加入ValidateRequest="false"的道理一样!取消验证,最懒的方法!注意安全性不高哦。

解决方案2:

使用内部函数生成Url的时候进行参数设置

比如:

@Html.ActionLink("修改", "protypetadd", "admin", new { ProTypeId = item.Protypeid }, null)
1

# 方法二:在出现问题的页面中,设置头部Page的属性ValidateRequest=false,代码如下:

<%@ Page Language="C#" ValidateRequest="false" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication13.WebForm1" %>
1

MSDN关于ValidateRequest属性的描述:如果 ASP.NET 针对危险值检查来自浏览器的输入,则为 true;否则为 false。 默认值为 true。

# 方法三:在配置文件中 设置system.web 节点下pages节点的validateRequest="false",代码如下:

  <system.web>
    <pages validateRequest="false"></pages>
    <httpRuntime requestValidationMode="2.0"/>
  </stytem.web>
1
2
3
4

注意:

  • 1、方法三要慎用,方法三是全局配置,一旦关闭了全站的请求验证,网站就很有可能受到各种攻击以及接受许多危险的数据,比如最常见的XSS攻击。

  • 2、方法二和方法三设置生效都有一个前提,就是配置文件中的httpRuntime 节点的验证模式必须为2.0,.Net Framework4.0版本以上的项目,不设置的话默认验证模式是4.0,4.0的验证模式ValidateRequest=false将会无效,除非你的ASP.NET项目使用的还是.NET 4.0以下的框架。

代码如下:

  <system.web>
    <httpRuntime requestValidationMode="2.0"/>
  </stytem.web>
1
2
3

总结MSDN的资料,概括来说就是4.0的验证模式默认是全站HTTP请求都会进行验证,包括COOKIE请求、.ashx一般处理程序请求都会进行验证。而2.0的模式只是针对当前的.aspx页面,这里看下微软MSDN上的说明:

RequestValidationMode 属性指定要使用的 ASP.NET 验证方法。 这可以是在 ASP.NET 版本(早于版本 4)中或在 .NET Framework 4 中使用的版本中使用的算法。 可以将属性设置为下列值:

4.0(默认)。 HttpRequest 对象在内部设置一个标志,该标志指示每当访问 HTTP 请求数据时应触发请求验证。 这可保证在请求期间访问数据(如 cookie 和 URL)之前触发请求验证。 配置文件中页元素(如果有的话)的请求验证设置或单独页面中的 @ 页指令的请求验证设置将被忽略。 2.0. 仅对网页(而不是对所有 HTTP 请求)启用请求验证。 此外,配置文件中的 pages 元素(如果有的话)的请求验证设置或单独页中的 @ Page 指令的请求验证设置用来确定要验证哪些页请求。

未验证分配给此属性的值是否匹配特定版本的 ASP.NET。 任何小于 4.0(例如 3.7、2.9 或 2.0)的数值将被解释为 2.0。 任何大于 4.0 的数值将被解释为 4.0。

若要在配置文件中设置此值,可以为 httpRuntime 元素的 requestValidationMode 特性赋值。 有关更多信息,请参见 httpRuntime 元素(ASP.NET 设置架构)。

3、方法一也是在特定环境下才可以取消验证,对于用户的输入内容,必须要做好相对应的防御措施,基本的可以使用HttpUtility.HtmlEncode()对用户输入文本进行编码。当然推荐还是使用AntiXSS类库,在.NET Framework4.5以上的版本已经将这个类库包含进去,有兴趣的朋友可以研究下System.Web.Security.AntiXss 命名空间。

# asp.net mvc项目中的处理方法

另外一个就是ASP.NET MVC项目,MVC中比较简单,只要在控制器上设置属性ValidateInput(false)就行,例如:

[HttpPost]
[ValidateInput(false)]
public ActionResult Create(string strText)
{
/*此处省略代码1000行……..*/
}
1
2
3
4
5
6

另外即使是ASP.NET MVC,也要在配置文件中设置验证模式为2.0,否则设置也是无效的。

引发ASP.NET在请求中检测到包含潜在危险的数据的原因 首先要理解一个概念,即不要信任所有用户提交到网站的信息,要假设所有用户发送的数据都是包含恶意并且有危险的脚本内容,这是网站一个非常重要的安全概念!对于用户所进行的操作,应当设置白名单,即只允许用户操作什么,只允许用户提交什么样的数据,而不是禁止用户能操作什么,黑名单的过滤总会有漏洞,使用白名单的过滤方法网站才能起到较好的保障。

ASP.NET对于用户的请求验证机制正是一种白名单的过滤方式,在ASP.NET 中,默认只允许用户提交安全的数据给网站,数据中一旦包含HTML代码、javascript脚本代码或者其他恶意数据,都将会被拦截从而引发HttpRequestValidationException异常,页面上就会出现相应的警告提示!

HttpRequestValidationException异常的详细错误信息

从客户端(ctl00$MainContent$txtText="...sdf asfd a<img alt="" src="htt...")中检测到有潜在危险的 Request.Form 值。
1

说明: ASP.NET 在请求中检测到包含潜在危险的数据,因为它可能包括 HTML 标记或脚本。该数据可能表示存在危及应用程序安全的尝试,如跨站点脚本攻击。如果此类型的输入适用于您的应用程序,则可包括明确允许的网页中的代码。有关详细信息,请参阅Request Validation in ASP.NET。

异常详细信息: System.Web.HttpRequestValidationException: 从客户端(ctl00$MainContent$txtText="...sdf asfd a<img alt="" src="htt...")中检测到有潜在危险的 Request.Form 值。
1

网页上出现的HttpRequestValidationException异常错误提示

PS:描述中所说的Request.Form值是取决于提交的方式,如果是GET提交则提示Request.QueryString值有检测到潜在危险。另外文章中所有引用MSDN的资料在底部都有提供链接。

# 软MSDN上关于此异常的相关资料

  • HttpRequestValidationException 类 http://msdn.microsoft.com/zh-cn/library/system.web.httprequestvalidationexception(v=vs.110).aspx
  • PagesSection.ValidateRequest 属性 http://msdn.microsoft.com/zh-cn/library/system.web.configuration.pagessection.validaterequest(v=vs.110).aspx
  • HttpRuntimeSection.RequestValidationMode 属性 http://msdn.microsoft.com/zh-cn/library/system.web.configuration.httpruntimesection.requestvalidationmode(v=vs.110).aspx
  • 脚本侵入概述 http://msdn.microsoft.com/zh-cn/library/w1sw53ds(v=vs.110).aspx
  • 如何:通过对字符串应用 HTML 编码在 Web 应用程序中防止脚本侵入 http://msdn.microsoft.com/zh-cn/library/a2a4yykt(v=vs.100).aspx
  • AntiXssEncoder 类 http://msdn.microsoft.com/zh-cn/library/system.web.security.antixss.antixssencoder(v=vs.110).aspx